package com.bml.architect.delay;

import com.bml.architect.utils.MqConstants;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.io.UnsupportedEncodingException;

/**
 * 延迟消息
 * 延迟消息实现的效果就是在调用producer.send方法后，消息并不会立即发送出去，而是会等一
 * 段时间再发送出去。这是RocketMQ特有的一个功能。
 * 那会延迟多久呢？延迟时间的设置就是在Message消息对象上设置一个延迟级别
 * message.setDelayTimeLevel(3);
 * 开源版本的RocketMQ中，对延迟消息并不支持任意时间的延迟设定(商业版本中支持)，而是只支
 * 持18个固定的延迟级别，1到18分别对应messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m
 * 6m 7m 8m 9m 10m 20m 30m 1h 2h。这从哪里看出来的？其实从rocketmq-console控制台就
 * 能看出来。而这18个延迟级别也支持自行定义，不过一般情况下最好不要自定义修改。
 * 那这么好用的延迟消息是怎么实现的？这18个延迟级别除了在延迟消息中用，还有什么地方用到
 * 了？别急，我们会在后面部分进行详细讲解。
 */
public class DelayProducer {

    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException, UnsupportedEncodingException {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr(MqConstants.getNameServerAddr());
        producer.start();
        System.out.println("rocketmq连接成功...");
        //发送消息

        Message message = new Message("TopicTest", "TagA", "simplekey11", ("rocketmq delay message  ").getBytes(RemotingHelper.DEFAULT_CHARSET));
        //同步传递消息，消息会发给集群中的一个Broker节点,broker节点接受到过后会返回一个发送对象，包含了发送状态
        message.setDelayTimeLevel(3);//延迟10s发送消息
        SendResult send = producer.send(message);
        System.out.println("消息发送完毕");
        producer.shutdown();

    }
}
